package org.vespene.builder;

import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.vespene.daoh2.project.ProjectMetadata;
import org.vespene.project.AnnotationsUtils;
import org.vespene.properties.SpringProperties;
import org.vespene.spring.model.Entity;
import org.vespene.spring.model.SpringDefinitions;
import org.vespene.spring.model.SpringServices;



public class ToggleNatureAction implements IObjectActionDelegate {

	private ISelection selection;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
	 */
	public void run(IAction action) {
		if (selection instanceof IStructuredSelection) {
			for (Iterator it = ((IStructuredSelection) selection).iterator(); it
					.hasNext();) {
				Object element = it.next();
				IProject project = null;
				if (element instanceof IProject) {
					project = (IProject) element;
				} else if (element instanceof IAdaptable) {
					project = (IProject) ((IAdaptable) element)
							.getAdapter(IProject.class);
				}
				if (project != null) {
					toggleNature(project);
				}
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
	 *      org.eclipse.jface.viewers.ISelection)
	 */
	public void selectionChanged(IAction action, ISelection selection) {
		this.selection = selection;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
	 *      org.eclipse.ui.IWorkbenchPart)
	 */
	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
	}

	/**
	 * Toggles sample nature on a project
	 * 
	 * @param project
	 *            to have sample nature added or removed
	 */
	private void toggleNature(IProject project) {
		try {
			IProjectDescription description = project.getDescription();
			String[] natures = description.getNatureIds();

			for (int i = 0; i < natures.length; ++i) {
				if (VespeneNature.NATURE_ID.equals(natures[i])) {
					// Remove the nature
					String[] newNatures = new String[natures.length - 1];
					System.arraycopy(natures, 0, newNatures, 0, i);
					System.arraycopy(natures, i + 1, newNatures, i,
							natures.length - i - 1);
					description.setNatureIds(newNatures);
					project.setDescription(description, null);
					
					return;
				}
			}

			// Add the nature
			String[] newNatures = new String[natures.length + 1];
			System.arraycopy(natures, 0, newNatures, 0, natures.length);
			newNatures[natures.length] = VespeneNature.NATURE_ID;
			description.setNatureIds(newNatures);
			project.setDescription(description, null);
			
			
			SpringProperties springProperties = new SpringProperties( project );
			SpringDefinitions springDefinitions = springProperties.loadSpringDefinitions();
			
			
			//textServiceNamePattern.setText( (springDefinitions.getServiceNamePattern()!=null) ? springDefinitions.getServiceNamePattern() : "s${EntityName}" );
			
			springDefinitions.setServiceNamePattern( "s${EntityName}" );
			
			springDefinitions.setServiceInterfacePattern( "I${serviceName}Service" ); 
			springDefinitions.setServiceInterfaceTemplateFile( "springServiceInter.ftl" ); 
			
			springDefinitions.setServiceImplementationPattern( "${serviceName}SpringService" );
			springDefinitions.setServiceImplementationTemplateFile( "springServiceImpl.ftl" );
			
			springDefinitions.setDaoInterfacePattern( "I${serviceName}Dao" ); 
			springDefinitions.setDaoInterfaceTemplateFile( "springJpaDAOInter.ftl" ); 
			
			springDefinitions.setDaoImplementationPattern( "${serviceName}JPADao" ); 
			springDefinitions.setDaoImplementationTemplateFile( "springJpaDAOImpl.ftl" ); 
			
			springProperties.storeSpringDefinitions(springDefinitions);
			
			
			String fullPath = project.getLocation().toString()+"/.vespene/vespenedb";		
			ProjectMetadata projectMetadata = new ProjectMetadata(fullPath);
			projectMetadata.create();
			
			
		} catch (CoreException e) {
		}
	}

}
